import os
import msvcrt  # 用于 Windows 键盘输入捕获

class TerminalInput:
    def __init__(self, max_input_len=50, max_display_len=30):
        self.max_input_len = max_input_len  # 最大输入长度
        self.max_display_len = max_display_len  # 屏幕显示的最大长度
        self.input_str = ""  # 当前输入的字符串
        self.display_str = ""  # 当前显示的字符串（基于光标位置）

        self.cursor_pos = 0  # 当前光标位置
        self.curIdx = 0  # 当前显示的开始索引

    def update_display(self):
        # 根据光标位置更新显示的字符串
        if self.curIdx < 0:
            self.curIdx = 0
        start_idx = self.curIdx
        end_idx = min(self.curIdx + self.max_display_len, self.max_input_len)

        self.display_str = self.input_str[start_idx:end_idx]

    def move_cursor_left(self):
        # print('llll')
        if self.cursor_pos > 0:
            self.cursor_pos -= 1
        if self.cursor_pos < self.curIdx:
            self.curIdx = self.cursor_pos

    def move_cursor_right(self):
        # print('rrrr')
        if self.cursor_pos < self.max_input_len:
            self.cursor_pos += 1
            if self.cursor_pos > len(self.input_str):
                self.cursor_pos = len(self.input_str)
        if self.cursor_pos > self.curIdx + self.max_display_len:
            self.curIdx += 1

    def delete_char(self):
        if self.cursor_pos > 0:
            self.input_str = self.input_str[:self.cursor_pos - 1] + self.input_str[self.cursor_pos:]
            self.move_cursor_left()
            self.curIdx -= 1

    def add_char(self, char):
        # 控制最大输入长度
        if len(self.input_str) < self.max_input_len:
            self.input_str = self.input_str[:self.cursor_pos] + char + self.input_str[self.cursor_pos:]
            self.move_cursor_right()

    def get_input(self):
        return self.get_input_windows()


    def get_input_windows(self):
        while True:
            self.update_display()

            # 清屏并显示当前输入框状态
            os.system('cls')  # Windows 清屏方法
            print(f"Input : {self.display_str}")
            print(f"Cursor: {' ' * (self.cursor_pos - self.curIdx)}^")  # 光标指示
            print(self.cursor_pos, self.curIdx, len(self.input_str))
            char = msvcrt.getch()  # 获取键盘输入

            # 检查方向键
            if char == b'\xe0':  # 方向键前缀
                char = msvcrt.getch()  # 获取方向键的第二个字节
                if char == b'K':  # 左箭头
                    self.move_cursor_left()
                elif char == b'M':  # 右箭头
                    self.move_cursor_right()
            elif char == b'\x1b':  # ESC键，退出
                break
            elif char == b'\x08':  # Backspace键
                self.delete_char()
            elif char.isalpha() or char.isdigit() or 32 <= ord(char) <= 126:  # 判断字符是否可打印
                self.add_char(char.decode())

# 使用示例
if __name__ == "__main__":
    terminal_input = TerminalInput(max_input_len=10, max_display_len=4)
    terminal_input.get_input()
    print(f"Final input: {terminal_input.input_str}")
    